package com.yzh.openai.domain.tool.service;

import cn.hutool.core.io.FileUtil;
import com.yzh.openai.domain.tool.model.entity.ExcelReqEntity;
import com.yzh.openai.domain.tool.model.entity.UmlReqEntity;
import com.yzh.openai.types.common.Constants;
import com.yzh.openai.types.exception.BusinessException;
import com.yzh.openai.types.utils.excel.ExcelUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class ToolService extends AbstractToolService{

    @Override
    public String[] analyzeExcel(ExcelReqEntity req, MultipartFile file) {
        // 2.校验文件
        long size = file.getSize();
        final long ONE_MB = 1024 * 1024L;
        if (size > ONE_MB) throw new BusinessException(Constants.ResponseCode.PARAM_ERROR, "文件大小超过1MB");
        // 3.校验文件后缀
        String suffix = FileUtil.getSuffix(file.getOriginalFilename());
        List<String> validSuffixList = Arrays.asList("xls", "xlsx");
        if (!validSuffixList.contains(suffix))
            throw new BusinessException(Constants.ResponseCode.PARAM_ERROR, "文件格式不正确");
        // 4.组装问题内容
        String rule = "你是一个数据分析师和前端开发专家，接下来我会按照以下固定格式给你提供内容：\n" +
                "分析需求：\n" +
                "{数据分析的需求或者目标}\n" +
                "初始数据：\n" +
                "{csv格式的原始数据，用,作为分隔符}\n" +
                "图表类型：{指定Echarts图表类型}\n" +
                "请根据这三部分内容，按照以下指定格式生成内容（此外不要输出任何多余的开头、结尾、注释）\n" +
                "【【【【【\n" +
                "{前端 Echarts V5 的 option 配置对象js代码，必须是JSON格式，并且合理地将数据进行可视化，不要生成任何多余的内容，比如注释}\n" +
                "【【【【【\n" +
                "{明确的数据分析结论、越详细越好，不要生成多余的注释}";
        StringBuilder sb = new StringBuilder();

        sb.append("分析需求：").append(req.getContent()).append("\n");
        sb.append("初始数据：");
        // 5.读取Excel内容
        String csv = ExcelUtils.excelToCsv(file);
        sb.append(csv).append("\n");
        sb.append("图表类型：").append(req.getChartType()).append("\n");
        String aiGen = null;
        try{
            aiGen = genAiAnalysis(rule, sb.toString());
        }catch (Exception e) {
            throw new BusinessException(Constants.ResponseCode.SYSTEM_ERROR, "系统内部异常");
        }
        // 6.分割数据
        String[] res = aiGen.split("【【【【【");
        if (res.length < 3) throw new BusinessException(Constants.ResponseCode.CHAT_ERROR, "内容过多，AI无法生成");
        // 7.处理数据（删除头尾多余的内容）中间使用管道符隔开
        res[1] = res[1].replaceAll("```javascript|option = |```|;", "");
        System.out.println("处理后的数据：\n" + res[1]);
        return res;
    }
    
    public String analyzeUml(UmlReqEntity umlReqEntity) {
        // 1.设置请求模型规则
        String rule = "请根据下面的规则和图表类型生成mermaid代码，要保证结果详细且专业。但不要有多余的注释和代码无关的文字。";
        StringBuilder sb = new StringBuilder();
        sb.append("规则：").append(umlReqEntity.getContent()).append("\n");
        sb.append("图表类型：").append(umlReqEntity.getUmlType()).append("\n");
        
        // 2.AI分析数据
        String res = null;
        try {
            res = genAiAnalysis(rule, sb.toString());
        } catch (Exception e) {
            throw new BusinessException(Constants.ResponseCode.SYSTEM_ERROR, "系统内部异常");
        }
        System.out.println("AI生成原始数据：" + res);
        // 3.处理数据，使用正则表达式匹配Markdown代码
        Pattern pattern = Pattern.compile("```mermaid(.*?)```", Pattern.DOTALL);
        Matcher matcher = pattern.matcher(res);
        // 查找匹配的子串
        if (matcher.find()) {
            // 获取匹配的中间内容
            return matcher.group(1).trim();
        }
        throw new BusinessException(Constants.ResponseCode.CHAT_ERROR, "AI生成内容格式错误，请重试");
    }
    
}
